package com.bawei.club.test.flow

import android.os.Bundle
import android.util.Log
import androidx.activity.enableEdgeToEdge
import androidx.activity.viewModels
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.repeatOnLifecycle
import com.bawei.club.R
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.launch

/**
 flow流和协程结合使用，kotlin语言
 一.热流和冷流区别

 二.stateFlow和shareFlow区别

 三.操作符
基本操作符：操作1个flow
 （1）collect：收集
 （2）collectLatest：收集最新数据，丢弃旧数据，解决背压问题
 （3）map：就是用于将一个值映射成另一个值
 （4）filter：过滤
 （5）onEach：遍历，辅助查看数据，和collect不一样，不会从管道取出数据
 （6）debounce：延迟处理数据，适用于搜索框，输入框等场景，我们不应该在用户每输入一个字符时就立刻发起一条网络请求，
            而是应该在一定时间的停顿之后再发起网络请求。如果用户停顿了一段时间，很有可能说明用户已经结束了快速输入，
            开始期待一些搜索建议了。这样就能有效地避免发起无效网络请求的情况
 （7）sample：按照指定时间间隔采集数据
 （8）reduce：累加/累乘 无初始值
 （9）fold：累加/累乘 有初始值
重点操作符：操作2个以上flow
 a。2个以上接口依赖串行，平级的写法搞定，不会出现嵌套地狱,可以使用以下三个，建议使用flatMapLatest
 (10)flatMapConcat:有顺序
 (11)flatMapMerge:无顺序
 (12)flatMapLatest:丢弃旧数据，处理新数据，建议使用，搜索功能实现
 b。2个接口并行，保证同时请求完成做处理，使用zip

 四.生命周期：repeatOnLifecycle(Lifecycle.State.RESUMED)，只有页面处于resumed状态时才订阅数据

 问题优化1:
 安卓中页面中有很多按钮，每个按钮都会有请求，用户疯狂点击，怎么处理这个问题，想要处理最后一个点击，之前的点击不处理
 问题优化2:
 安卓中如何实现编辑框搜索建议优化，输入框等场景，我们不应该在用户每输入一个字符时就立刻发起一条网络请求，而是应该在一定时间的停顿之后再发起网络请求。如果用户停顿了一段时间，很有可能说明用户已经结束了快速输入，开始期待一些搜索建议了。这样就能有效地避免发起无效网络请求的情况
 问题优化3:
 接口串行，不想出现回调地狱
 接口并行，同时处理完做后续UI展示



 */
class FlowActivity : AppCompatActivity() {
    private val mViewModel:FlowViewModel by viewModels()
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        enableEdgeToEdge()
        setContentView(R.layout.activity_flow)

//        lifecycleScope.launch {
//            mViewModel.flow1.collect{
//                Log.d("TAG", "flow1: $it")
//            }
//            mViewModel.flow2.collect{
//                Log.d("TAG", "flow2: $it")
//            }
//        }
        mViewModel.getUserData()
        mViewModel.getWeatherData()

        lifecycleScope.launch {
            //开启子协程
            repeatOnLifecycle(Lifecycle.State.RESUMED){ //注意：只有页面处于resumed状态时才订阅数据
                launch {
                    mViewModel.flow1.collectLatest{ //collectLatest 收集最新的数据，丢弃旧数据
                        Log.d("TAG", "flow1: $it")
                        delay(3000)
                    }
                }
                launch {
                    mViewModel.flow2.collect{
                        Log.d("TAG", "flow2: $it")
                    }
                }
            }


        }
    }
}